/* Copyright (c) 2011 Timothée Lacroix
 * This file is part of HINAPT.
 *
 * HINAPT is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HINAPT is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HINAPT.  If not, see <http://www.gnu.org/licenses/>.
 */

/*!
  \file classifier.hpp
  Implémentation d'un étage de Viola-Jones : combinaison linéaire de ThFeatures
 */

#ifndef CLASSIFIER_HPP_INCLUDED
#define CLASSIFIER_HPP_INCLUDED

#include "_trainer.hpp"
#include "train.hpp"
#include "detector.hpp"
#include "utils.hpp"
#include "thresholdFeature.hpp"

class DetectorTh;

/*!
  Représente un étage de Viola-Jones
*/
class ClassifierTh{
  public :
    /*!
      \param img l'image sur laquelle on souhaite évaluer le Classifieur
      \param weight permet de pondérer l'évaluation des features, pour que les
            seuils calculés sur les images d'entrainement correspondent
      \return retourne 1 si l'image est détectée comme positive, -1 sinon
    */
    int eval(Mat img,double weight=1);
    /*!
      méthode de debug permettant d'afficher la composition du Classifieur
    */
    void print();
    /*!
      \param output flux de sortie pour la sauvegarde du Classifieur
      \return retourne true si l'écriture s'est bien passée, false sinon
    */
    bool save(ostream &output);
    /*!
      \param output flux d'entrée pour le chargement du Classifieur
      \return retourne true si la lecture s'est bien passée, false sinon
    */
    bool load(istream &input);

    ClassifierTh(){};
    /*!
      \param maxF seuil maximal de faux positifs
      \param minD seuil minimal de détection
      \param validation ensemble de validation
      \param trueVal contient 1 ou -1 selon la positivité de validation[i]
      \param pos ensemble d'entrainement positifs
      \param neg ensemble d'entrainement négatifs
      \param[in,out] cascade cascade de Classifieurs actuelle, on ajoute le
             classifieur créé en haut de la cascade
    */
    ClassifierTh(double maxF,double minD,
                       vector<Mat>& validation,vector<int>& trueVal,
                       vector<Mat>& pos,vector<Mat>& neg,
                       DetectorTh &cascade);

    /*!
      \param validation ensemble de validation
      \param trueVal contient 1 ou -1 selon la positivité de validation[i]
      \param file nom du fichier dans lequel on exporte les taux de faux
             positifs et de détection sur l'ensemble validation
    */
    void exportFD(vector<Mat>& validation,vector<int>& trueVal,string file);
    /*!
      \param img image sur laquelle on évalue le classifieur
      \return l'éaluation, non seuillée pour le debug
    */
    double evaluer(Mat img);

    /*!
      le seuil final du Classifieur
    */
    double threshold;
    /*!
      le poids final de chaques ThFeatures
    */
    vector<double> Fweights;
    /*!
      les ThFeatures composant le classifieur
    */
    vector<ThFeature> features;
};

#endif // CLASSIFIER_HPP_INCLUDED
